<!doctype html>



  


<html class="theme-next mist use-motion">
<head>
  <meta charset="UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>



<meta http-equiv="Cache-Control" content="no-transform" />
<meta http-equiv="Cache-Control" content="no-siteapp" />












  
  
  <link href="/vendors/fancybox/source/jquery.fancybox.css?v=2.1.5" rel="stylesheet" type="text/css" />




  
  
  
  

  
    
    
  

  

  

  

  

  
    
    
    <link href="//fonts.googleapis.com/css?family=Lato:300,300italic,400,400italic,700,700italic&subset=latin,latin-ext" rel="stylesheet" type="text/css">
  






<link href="/vendors/font-awesome/css/font-awesome.min.css?v=4.4.0" rel="stylesheet" type="text/css" />

<link href="/css/main.css?v=5.0.1" rel="stylesheet" type="text/css" />


  <meta name="keywords" content="OSI,TCP/IP,Socket," />








  <link rel="shortcut icon" type="image/x-icon" href="/favicon.ico?v=5.0.1" />






<meta name="description" content="说明：计算机网络的OSI7层网络模型，与TCP/IP模型。">
<meta name="keywords" content="OSI,TCP&#x2F;IP,Socket">
<meta property="og:type" content="article">
<meta property="og:title" content="OSI 7层网络模型与TCP&#x2F;IP模型">
<meta property="og:url" content="http://bebetter.site/2017/09/01/Network/OSI-7 TCP-IP Socket/index.html">
<meta property="og:site_name" content="gatewayzy">
<meta property="og:description" content="说明：计算机网络的OSI7层网络模型，与TCP/IP模型。">
<meta property="og:image" content="http://zcy.ckcest.cn/cdn/zy/20170906-Image-1.jpg">
<meta property="og:image" content="http://zcy.ckcest.cn/cdn/zy/20170906-Image-2.jpg">
<meta property="og:image" content="http://zcy.ckcest.cn/cdn/zy/20170906-Image-3.jpg">
<meta property="og:image" content="http://zcy.ckcest.cn/cdn/zy/20170906-Image-4.jpg">
<meta property="og:image" content="http://zcy.ckcest.cn/cdn/zy/20170906-Image-8.jpg">
<meta property="og:image" content="http://zcy.ckcest.cn/cdn/zy/20170906-Image-6.jpg">
<meta property="og:image" content="http://zcy.ckcest.cn/cdn/zy/20170906-Image-7.jpg">
<meta property="og:image" content="http://zcy.ckcest.cn/cdn/zy/20170906-Image-5.jpg">
<meta property="og:updated_time" content="2017-09-01T05:58:10.000Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="OSI 7层网络模型与TCP&#x2F;IP模型">
<meta name="twitter:description" content="说明：计算机网络的OSI7层网络模型，与TCP/IP模型。">
<meta name="twitter:image" content="http://zcy.ckcest.cn/cdn/zy/20170906-Image-1.jpg">



<script type="text/javascript" id="hexo.configuration">
  var NexT = window.NexT || {};
  var CONFIG = {
    scheme: 'Mist',
    sidebar: {"position":"right","display":"always"},
    fancybox: true,
    motion: true,
    duoshuo: {
      userId: 0,
      author: '博主'
    }
  };
</script>




  <link rel="canonical" href="http://bebetter.site/2017/09/01/Network/OSI-7 TCP-IP Socket/"/>

  <title> OSI 7层网络模型与TCP/IP模型 | gatewayzy </title>
</head>

<body itemscope itemtype="http://schema.org/WebPage" lang="zh-Hans">

  










  
  
    
  

  <div class="container one-collumn sidebar-position-right page-post-detail ">
    <div class="headband"></div>

    <header id="header" class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-meta ">
  

  <div class="custom-logo-site-title">
    <a href="/"  class="brand" rel="start">
      <span class="logo-line-before"><i></i></span>
      <span class="site-title">gatewayzy</span>
      <span class="logo-line-after"><i></i></span>
    </a>
  </div>
  <p class="site-subtitle">blog of gatewayzy</p>
</div>

<div class="site-nav-toggle">
  <button>
    <span class="btn-bar"></span>
    <span class="btn-bar"></span>
    <span class="btn-bar"></span>
  </button>
</div>

<nav class="site-nav">
  

  
    <ul id="menu" class="menu">
      
        
        <li class="menu-item menu-item-home">
          <a href="/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-home"></i> <br />
            
            首页
          </a>
        </li>
      
        
        <li class="menu-item menu-item-categories">
          <a href="/categories" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-th"></i> <br />
            
            分类
          </a>
        </li>
      
        
        <li class="menu-item menu-item-about">
          <a href="/about" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-user"></i> <br />
            
            关于
          </a>
        </li>
      
        
        <li class="menu-item menu-item-archives">
          <a href="/archives" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-archive"></i> <br />
            
            归档
          </a>
        </li>
      
        
        <li class="menu-item menu-item-tags">
          <a href="/tags" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-tags"></i> <br />
            
            标签
          </a>
        </li>
      

      
    </ul>
  

  
</nav>

 </div>
    </header>

    <main id="main" class="main">
      <div class="main-inner">
        <div class="content-wrap">
          <div id="content" class="content">
            

  <div id="posts" class="posts-expand">
    

  
  

  
  
  

  <article class="post post-type-normal " itemscope itemtype="http://schema.org/Article">

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
            
            
              
                OSI 7层网络模型与TCP/IP模型
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">
            <span class="post-meta-item-icon">
              <i class="fa fa-calendar-o"></i>
            </span>
            <span class="post-meta-item-text">发表于</span>
            <time itemprop="dateCreated" datetime="2017-09-01T13:58:10+08:00" content="2017-09-01">
              2017-09-01
            </time>
          </span>

          
            <span class="post-category" >
              &nbsp; | &nbsp;
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              <span class="post-meta-item-text">分类于</span>
              
                <span itemprop="about" itemscope itemtype="https://schema.org/Thing">
                  <a href="/categories/Network/" itemprop="url" rel="index">
                    <span itemprop="name">Network</span>
                  </a>
                </span>

                
                

              
            </span>
          

          
            
          

          

          
          

          
        </div>
      </header>
    


    <div class="post-body" itemprop="articleBody">

      
      

      
        <p><strong>说明：</strong>计算机网络的OSI7层网络模型，与TCP/IP模型。<br><a id="more"></a></p>
<p>参考文章：<br><a href="http://www.cnblogs.com/chengzhengfu/p/4584510.html" target="_blank" rel="external">OSI网络HTTP、TCP、UDP、Socket 知识总结</a></p>
<h2 id="OSI七层模型"><a href="#OSI七层模型" class="headerlink" title="OSI七层模型"></a>OSI七层模型</h2><p><img src="http://zcy.ckcest.cn/cdn/zy/20170906-Image-1.jpg" alt="image"></p>
<p>OSI模型共有七层，分别为物理层、数据链路层、网络层、传输层、会话层、表示层、应用层,也被依次称为 OSI 第一层、第二层、⋯⋯、 第七层。</p>
<ul>
<li>物理层、数据链路层和网络层通常被称作媒体层，是网络工程师所研究的对象；</li>
<li><p>传输层、会话层、表示层和应用层则被称作主机层，是用户所面向和关心的内容。</p>
<p>　　http协议   对应于应用层<br>　　tcp协议    对应于传输层<br>　　ip协议     对应于网络层<br>　　三者本质上没有可比性。何况HTTP协议是基于TCP连接的。<br>　　TCP/IP是传输层协议，主要解决数据如何在网络中传输；而HTTP是应用层协议，主要解决如何包装数据。</p>
</li>
<li><p>我们在传输数据时，可以只使用传输层（TCP/IP），但是那样的话，由于没有应用层，便无法识别数据内容.</p>
</li>
<li>如果想要使传输的数据有意义，则必须使用应用层协议，应用层协议很多，有HTTP、FTP、TELNET等等，也可以自己定义应用层协议。WEB使用HTTP作传输层协议，以封装HTTP文本信息，然后使用 TCP/IP 做传输层协议将它发送到网络上。</li>
<li>Socket是对 TCP/IP 协议的封装，Socket 本身并不是协议，而是一个调用接口（API），通过Socket，我们才能使用TCP/IP 协议。</li>
</ul>
<h2 id="TCP-IP-模型"><a href="#TCP-IP-模型" class="headerlink" title="TCP/IP 模型"></a>TCP/IP 模型</h2><p><img src="http://zcy.ckcest.cn/cdn/zy/20170906-Image-2.jpg" alt="image"><br>TCP/IP 模型分为四层,由下而上分别为网络访问层、网际层、传输层、应用层。<br>TCP/IP 由于有较少的层次,因而显得更简单,并且作为从因特网(INTERNET)上发展起来的协议,已经成了网络互连的事实标准。</p>
<h2 id="Http和Socket连接区别"><a href="#Http和Socket连接区别" class="headerlink" title="Http和Socket连接区别"></a>Http和Socket连接区别</h2><ul>
<li>短连接<br>　　连接-&gt;传输数据-&gt;关闭连接<br>　　HTTP是无状态的，浏览器和服务器每进行一次HTTP操作，就建立一次连接，但任务结束就中断连接。<br>　　也可以这样说：短连接是指 Socket 连接后发送后接收完数据后马上断开连接。</li>
<li><p>长连接<br>　　连接-&gt;传输数据-&gt;保持连接 -&gt; 传输数据-&gt; 。。。 -&gt;关闭连接。<br>　　长连接指建立 Socket 连接后不管是否使用都保持连接，但安全性较差。 </p>
</li>
<li><p>http的长连接  　<br>　HTTP也可以建立长连接的，使用Connection:keep-alive，HTTP 1.1默认进行持久连接。HTTP1.1和HTTP1.0相比较而言，最大的区别就是增加了持久连接支持(貌似最新的 http1.0 可以显示的指定 keep-alive),但还是无状态的，或者说是不可以信任的。</p>
</li>
<li><p>什么时候用长连接，短连接？</p>
<ul>
<li>长连接多用于操作频繁，点对点的通讯，而且连接数不能太多情况，。每个TCP连接都需要三步握手，这需要时间，如果每个操作都是先连接，再操作的话那么处理 速度会降低很多，所以每个操作完后都不断开，次处理时直接发送数据包就OK了，不用建立TCP连接。例如：数据库的连接用长连接， 如果用短连接频繁的通信会造成 Socket 错误，而且频繁的 Socket 创建也是对资源的浪费。 </li>
<li>而像WEB网站的http服务一般都用短链接，因为长连接对于服务端来说会耗费一定的资源，而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接 会更省一些资源，如果用长连接，而且同时有成千上万的用户，如果每个用户都占用一个连接的话，那可想而知吧。所以并发量大，但每个用户无需频繁操作情况下 需用短连好。 </li>
<li>总之，长连接和短连接的选择要视情况而定。</li>
</ul>
</li>
</ul>
<h3 id="HTTP连接"><a href="#HTTP连接" class="headerlink" title="HTTP连接"></a>HTTP连接</h3><ul>
<li><p>HTTP协议即超文本传送协议(Hypertext Transfer Protocol )，是Web联网的基础，也是手机联网常用的协议之一，HTTP协议是建立在TCP协议之上的一种应用。</p>
</li>
<li><p>HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应，在请求结束后，会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。</p>
<ol>
<li>在HTTP 1.0中，客户端的每次请求都要求建立一次单独的连接，在处理完本次请求后，就自动释放连接。</li>
<li>在HTTP 1.1中则可以在一次连接中处理多个请求，并且多个请求可以重叠进行，不需要等待一个请求结束后再发送下一个请求。</li>
</ol>
</li>
<li>由于HTTP在每次请求结束后都会主动释放连接，因此HTTP连接是一种“短连接”，要保持客户端程序的在线状态，需要不断地向服务器发起连接请求。通常的 做法是即时不需要获得任何数据，客户端也保持每隔一段固定的时间向服务器发送一次“保持连接”的请求，服务器在收到该请求后对客户端进行回复，表明知道客 户端“在线”。若服务器长时间无法收到客户端的请求，则认为客户端“下线”，若客户端长时间无法收到服务器的回复，则认为网络已经断开。</li>
<li>Http连接状态码：</li>
</ul>
<table>
<thead>
<tr>
<th style="text-align:center">http部分状态(一小部分)</th>
<th style="text-align:center">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">100</td>
<td style="text-align:center">Continue    继续。客户端应继续其请求</td>
</tr>
<tr>
<td style="text-align:center">101</td>
<td style="text-align:center">Switching Protocols    切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议，例如，切换到HTTP的新版本协议</td>
</tr>
<tr>
<td style="text-align:center">200</td>
<td style="text-align:center">OK    请求成功。一般用于GET与POST请求</td>
</tr>
<tr>
<td style="text-align:center">201</td>
<td style="text-align:center">Created    已创建。成功请求并创建了新的资源</td>
</tr>
<tr>
<td style="text-align:center">202</td>
<td style="text-align:center">Accepted    已接受。已经接受请求，但未处理完成</td>
</tr>
<tr>
<td style="text-align:center">300</td>
<td style="text-align:center">Multiple Choices    多种选择。请求的资源可包括多个位置，相应可返回一个资源特征与地址的列表用于用户终端（例如：浏览器）选择</td>
</tr>
<tr>
<td style="text-align:center">301</td>
<td style="text-align:center">Moved Permanently    永久移动。请求的资源已被永久的移动到新URI，返回信息会包括新的URI，浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替</td>
</tr>
<tr>
<td style="text-align:center">302</td>
<td style="text-align:center">Found    临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI</td>
</tr>
<tr>
<td style="text-align:center">303</td>
<td style="text-align:center">See Other    查看其它地址。与301类似。使用GET和POST请求查看</td>
</tr>
<tr>
<td style="text-align:center">400</td>
<td style="text-align:center">Bad Request    客户端请求的语法错误，服务器无法理解</td>
</tr>
<tr>
<td style="text-align:center">401</td>
<td style="text-align:center">Unauthorized    请求要求用户的身份认证</td>
</tr>
<tr>
<td style="text-align:center">402</td>
<td style="text-align:center">Payment Required    保留，将来使用</td>
</tr>
<tr>
<td style="text-align:center">403</td>
<td style="text-align:center">Forbidden    服务器理解请求客户端的请求，但是拒绝执行此请求</td>
</tr>
<tr>
<td style="text-align:center">404</td>
<td style="text-align:center">Not Found    服务器无法根据客户端的请求找到资源（网页）。通过此代码，网站设计人员可设置”您所请求的资源无法找到”的个性页面</td>
</tr>
<tr>
<td style="text-align:center">405</td>
<td style="text-align:center">Method Not Allowed    客户端请求中的方法被禁止</td>
</tr>
<tr>
<td style="text-align:center">406</td>
<td style="text-align:center">Not Acceptable    服务器无法根据客户端请求的内容特性完成请求</td>
</tr>
<tr>
<td style="text-align:center">500</td>
<td style="text-align:center">Internal Server Error    服务器内部错误，无法完成请求</td>
</tr>
<tr>
<td style="text-align:center">501</td>
<td style="text-align:center">Not Implemented    服务器不支持请求的功能，无法完成请求</td>
</tr>
<tr>
<td style="text-align:center">502</td>
<td style="text-align:center">Bad Gateway    充当网关或代理的服务器，从远端服务器接收到了一个无效的请求</td>
</tr>
<tr>
<td style="text-align:center">503</td>
<td style="text-align:center">Service Unavailable    由于超载或系统维护，服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中</td>
</tr>
<tr>
<td style="text-align:center">504</td>
<td style="text-align:center">Gateway Time-out    充当网关或代理的服务器，未及时从远端服务器获取请求</td>
</tr>
<tr>
<td style="text-align:center">505</td>
<td style="text-align:center">HTTP Version not supported    服务器不支持请求的HTTP协议的版本，无法完成处理</td>
</tr>
</tbody>
</table>
<h3 id="Socket"><a href="#Socket" class="headerlink" title="Socket"></a>Socket</h3><p>Socket 是应用层与TCP/IP协议族通信的中间软件抽象层，它是一组接口。首先让我们通过一张图知道Socket在哪里？</p>
<p><img src="http://zcy.ckcest.cn/cdn/zy/20170906-Image-3.jpg" alt="image"></p>
<h4 id="套接字（Socket）概念"><a href="#套接字（Socket）概念" class="headerlink" title="套接字（Socket）概念"></a>套接字（Socket）概念</h4><ul>
<li>套接字（Socket）是通信的基石，是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示，包含进行网络通信必须的五种信息：<strong>连接使用的协议，本地主机的IP地址，本地进程的协议端口，远地主机的IP地址，远地进程的协议端口</strong>。</li>
<li>应用层通过传输层进行数据通信时，TCP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。为了区别不同的应用程序进程和连接，许多计算机操作系统为应用程序与TCP／IP协议交互提供了套接字(Socket)接口。应用层可以和传输层通过Socket接口，区分来自不同应用程序进程或网络连接的通信，实现数据传输的并发服务。</li>
</ul>
<h4 id="建立Socket连接"><a href="#建立Socket连接" class="headerlink" title="建立Socket连接"></a>建立Socket连接</h4><ul>
<li>建立 Socket 连接至少需要一对套接字，其中一个运行于客户端，称为ClientSocket，另一个运行于服务器端，称为ServerSocket。</li>
<li>套接字之间的连接过程分为三个步骤：服务器监听，客户端请求，连接确认。<ul>
<li>服务器监听 listen：服务器端套接字并不定位具体的客户端套接字，而是处于等待连接的状态，实时监控网络状态，等待客户端的连接请求。</li>
<li>客户端请求 syn：指客户端的套接字提出连接请求，要连接的目标是服务器端的套接字。为此，客户端的套接字必须首先描述它要连接的服务器的套接字，指出服务器端套接字的地址和端口号，然后就向服务器端套接字提出连接请求。</li>
<li>连接确认 ack：当服务器端套接字监听到或者说接收到客户端套接字的连接请求时，就响应客户端套接字的请求，<strong>建立一个新的线程</strong>，把服务器端套接字的描述发给客户端，一旦客户端确认了此描述，双方就正式建立连接。而服务器端套接字继续处于监听状态，继续接收其他客户端套接字的连接请求。</li>
</ul>
</li>
</ul>
<h4 id="Socket连接与TCP、UDP连接"><a href="#Socket连接与TCP、UDP连接" class="headerlink" title="Socket连接与TCP、UDP连接"></a>Socket连接与TCP、UDP连接</h4><ul>
<li>常用的Socket类型有两种：<ul>
<li>流式Socket（SOCK_STREAM）：流式套接字是一种面向连接的 Socket，针对于面向连接的TCP服务应用；</li>
<li>数据报式Socket（SOCK_DGRAM）:数据报式 Socket 是一种无连接的 Socket ，对应于无连接的UDP服务应用。</li>
</ul>
</li>
</ul>
<h4 id="Socket连接与HTTP连接"><a href="#Socket连接与HTTP连接" class="headerlink" title="Socket连接与HTTP连接"></a>Socket连接与HTTP连接</h4><ul>
<li><p>由于通常情况下 Socket 连接就是TCP连接，因此 Socket 连接一旦建立，通信双方即可开始相互发送数据内容，直到双方连接断开。但在实际网络应用中，客户端到服务器之间的通信往往需要穿越多个中间节点，例如路由器、网关、防火墙等，大部分防火墙默认会关闭长时间处于非活跃状态的连接而导致 Socket 连接断连，因此需要通过轮询告诉网络，该连接处于活跃状态。</p>
</li>
<li><p>HTTP连接使用的是“请求—响应”的方式，不仅在请求时需要先建立连接，而且需要客户端向服务器发出请求后，服务器端才能回复数据。</p>
</li>
<li>很多情况下，需要服务器端主动向客户端推送数据，保持客户端与服务器数据的实时与同步。此时若双方建立的是Socket连接，服务器就可以直接将数据传送给 客户端；若双方建立的是HTTP连接，则服务器需要等到客户端发送一次请求后才能将数据传回给客户端，因此，客户端定时向服务器端发送连接请求，不仅可以保持在线，同时也是在“询问”服务器是否有新的数据，如果有就将数据传给客户端。</li>
</ul>
<h2 id="基于Socket实现TCP架构"><a href="#基于Socket实现TCP架构" class="headerlink" title="基于Socket实现TCP架构"></a>基于Socket实现TCP架构</h2><ul>
<li>基本TCP客户—服务器程序设计基本框架，如下图。</li>
</ul>
<p><img src="http://zcy.ckcest.cn/cdn/zy/20170906-Image-4.jpg" alt="image">
　　</p>
<ul>
<li>整个TCP连接过程：三次握手建立连接、数据传输、四次挥手释放连接。如下图。</li>
</ul>
<p><img src="http://zcy.ckcest.cn/cdn/zy/20170906-Image-8.jpg" alt="image"></p>
<h3 id="socket状态说明"><a href="#socket状态说明" class="headerlink" title="socket状态说明"></a>socket状态说明</h3><ul>
<li>windows和linux都可以使用netstat命令查看网络端口连接状态。</li>
<li>linux推荐更好的ss命令（socket status）、<code>lsof -i :808</code>·。<ul>
<li>LISTENING状态<ul>
<li>server（记为我方）启动后首先处于侦听（LISTENING）状态。</li>
</ul>
</li>
<li>ESTABLISHED状态<ul>
<li>ESTABLISHED的意思是建立连接。表示两台机器正在通信。</li>
</ul>
</li>
<li>CLOSE_WAIT<ul>
<li>对方主动关闭连接或者网络异常导致连接中断，这时我方的状态会变成CLOSE_WAIT 此时我方要调用close()来使得连接正确关闭</li>
</ul>
</li>
<li>TIME_WAIT<ul>
<li>server主动调用close()断开连接，收到对方确认后状态变为TIME_WAIT。TCP协议规定TIME_WAIT状态会一直持续2MSL(即两倍的分段最大生存期)，以此来确保旧的连接状态不会对新连接产生影响。处于TIME_WAIT状态的连接占用的资源不会被内核释放，所以作为服务器，在可能的情况下，尽量不要主动断开连接，以减少TIME_WAIT状态造成的资源浪费。</li>
</ul>
</li>
</ul>
</li>
<li>socket状态说明<ul>
<li>CLOSED    没有使用这个套接字[netstat 无法显示closed状态]</li>
<li>LISTEN    套接字正在监听连接[调用listen后]</li>
<li>SYN_SENT    套接字正在试图主动建立连接[发送SYN后还没有收到ACK]</li>
<li>SYN_RECEIVED    正在处于连接的初始同步状态[收到对方的SYN，但还没收到自己发过去的SYN的ACK]</li>
<li>ESTABLISHED    连接已建立</li>
<li>CLOSE_WAIT    远程套接字已经关闭：正在等待关闭这个套接字[被动关闭的一方收到FIN]</li>
<li>FIN_WAIT_1    套接字已关闭，正在关闭连接[发送FIN，没有收到ACK也没有收到FIN]</li>
<li>CLOSING    套接字已关闭，远程套接字正在关闭，暂时挂起关闭确认[在FIN_WAIT_1状态下收到被动方的FIN]</li>
<li>LAST_ACK    远程套接字已关闭，正在等待本地套接字的关闭确认[被动方在CLOSE_WAIT状态下发送FIN]</li>
<li>FIN_WAIT_2    套接字已关闭，正在等待远程套接字关闭[在FIN_WAIT_1状态下收到发过去FIN对应的ACK]</li>
<li>TIME_WAIT    这个套接字已经关闭，正在等待远程套接字的关闭传送[FIN、ACK、FIN、ACK都完毕，这是主动方的最后一个状态，经过2MSL时间后变为CLOSED状态]</li>
</ul>
</li>
<li>其他状态说明<ul>
<li>connect返回-1 <ul>
<li>errno=110(ETIMEDOUT)，当服务器端网线拔了的时候，客户端发送SYN过去就会收不到ACK，因此就会出现这个错误，1分钟内就会返回这个错误。error no = 110</li>
<li>errno=111(ECONNREFUSED)，当服务器未listen时，就会报这个错</li>
</ul>
</li>
<li>ESTABLISHED不一定真的establish<ul>
<li>这是因为LINUX不像其他操作系统在收到SYN为该连接立马分配一块内存空间用于存储相关的数据和结构，而是延迟到接收到client的ACK，即三次握手真正完成后才分配空间，这是为了防范SYN flooding攻击。 如果是这种情况，那么就会出现<strong>client端为ESTABLISHED状态，server为SYN_RECV状态</strong>。 </li>
<li>并且server的SYN_RECV状态在一定时间后会消失，client的established状态也会消失。这是因为server在SYN_RECV状态时，会像client发送多次的SYN+ACK（因为他以为自己的这个包对方没收到），发送的次数定义在/proc/sys/net/ipv4/tcp_synack_retries中，默认为5。在发送5次之后还没有收到ACK，就将其回收了，所以用netstat查看就看不到这个SYN_RECV状态了。并且会向client发送RST信号。这就会导致client的这种半连接状态也会消失。</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="TCP三次握手"><a href="#TCP三次握手" class="headerlink" title="TCP三次握手"></a>TCP三次握手</h3><p>相对于SOCKET开发者，TCP创建过程和连接拆除过程是由 TCP/IP 协议栈自动创建的。因此开发者并不需要控制这个过程。但是对于理解TCP底层运作机制，相当有帮助。</p>
<p>所谓三次握手(Three-way Handshake)，是指建立一个TCP连接时，需要客户端和服务器总共发送3个包。</p>
<p>三次握手的目的是连接服务器指定端口，建立TCP连接,并同步连接双方的序列号和确认号并交换 TCP 窗口大小信息.在 Socket 编程中，客户端执行connect()时。将触发三次握手。 </p>
<ul>
<li>client发起一个seq=x的包，且syn标志位为1，表示是个syn请求</li>
<li>server发送一个seq=y的包，且syn标志位为1，表示是个syn应答，并ack=x+1</li>
<li>client发送一个seq=x+1的包，且ack=y+1，表示是个ack包，而syn标志位为0表示不是同步包。</li>
</ul>
<p><img src="http://zcy.ckcest.cn/cdn/zy/20170906-Image-6.jpg" alt="image"></p>
<h2 id="TCP四次挥手"><a href="#TCP四次挥手" class="headerlink" title="TCP四次挥手"></a>TCP四次挥手</h2><p>TCP的连接的拆除需要发送四个包，因此称为四次挥手(four-way handshake)。客户端或服务器均可主动发起挥手动作，在socket编程中，任何一方执行close()操作即可产生挥手操作。</p>
<p>为什么连接的时候是三次握手，关闭的时候却是四次挥手？</p>
<pre><code>* 因为当Server端收到Client端的SYN连接请求报文后，可以直接发送SYN+ACK报文。其中ACK报文是用来应答的，SYN报文是用来 同步的。但是关闭连接时，当Server端收到FIN报文时，很可能并不会立即关闭SOCKET，所以只能先回复一个ACK报文，告诉Client端，” 你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了，我才能发送FIN报文，因此不能一起发送。故需要四步握手。
</code></pre><p><img src="http://zcy.ckcest.cn/cdn/zy/20170906-Image-7.jpg" alt="image"></p>
<h2 id="基于Socket实现UDP架构"><a href="#基于Socket实现UDP架构" class="headerlink" title="基于Socket实现UDP架构"></a>基于Socket实现UDP架构</h2><ul>
<li>基本UDP客户—服务器程序设计基本框架流程图<br><img src="http://zcy.ckcest.cn/cdn/zy/20170906-Image-5.jpg" alt="image"></li>
</ul>
<h2 id="协议的区别"><a href="#协议的区别" class="headerlink" title="协议的区别"></a>协议的区别</h2><h3 id="TCP、UDP、HTTP、SOCKET之间的区别"><a href="#TCP、UDP、HTTP、SOCKET之间的区别" class="headerlink" title="TCP、UDP、HTTP、SOCKET之间的区别"></a>TCP、UDP、HTTP、SOCKET之间的区别</h3><ul>
<li>TCP和UDP：传输层协议；</li>
<li>HTTP：应用层协议；</li>
<li>SOCKET：TCP/IP网络的API。</li>
<li>TCP/IP代表传输控制协议/网际协议，指的是一系列协议。</li>
<li>TCP和UDP使用IP协议从一个网络传送数据包到另一个网络。把IP想像成一种高速公路，它允许其它协议在上面行驶并找到到其它电脑的出口。</li>
<li>TCP和UDP是高速公路上的“卡车”，它们携带的货物就是像HTTP，文件传输协议FTP这样的协议等。</li>
<li>TCP和UDP是FTP、HTTP和SMTP之类使用的传输层协议。</li>
<li>HTTP(超文本传输协议)是利用TCP在两台电脑(通常是Web服务器和客户端)之间传输信息的协议。</li>
<li>客户端使用Web浏览器发起HTTP请求给Web服务器，Web服务器发送被请求的信息给客户端。</li>
<li>记住，需要IP协议来连接网络;TCP是一种允许我们安全传输数据的机制，使用TCP协议来传输数据的HTTP是Web服务器和客户端使用的特殊协议。</li>
<li>Socket 接口是TCP/IP网络的API，Socket接口定义了许多函数或例程，用以开发TCP/IP网络上的应用程序。</li>
</ul>
<h3 id="tcp和udp的区别"><a href="#tcp和udp的区别" class="headerlink" title="tcp和udp的区别"></a>tcp和udp的区别</h3><ul>
<li>TCP：面向连接、传输可靠(保证数据正确性,保证数据顺序)、用于传输大量数据(流模式)、速度慢，建立连接需要开销较多(时间，系统资源)。</li>
<li>UDP：面向非连接、传输不可靠、用于传输少量数据(数据包模式)、速度快。由于是面向无连接的协议，也就是说，只要知道接收端的IP和端口，且网络是可达的，任何主机都可以向接收端发送数据。这时候，如果一次能读取超过一个报文的数据，则会乱套。比如，主机A向发送了报文P1，主机B发送了报文P2，如果能够读取超过一个报文的数据，那么就会将P1和P2的数据合并在了一 起，这样的数据是没有意义的。</li>
</ul>

      
    </div>

    <div>
      
        

      
    </div>

    <div>
      
        

      
    </div>

    <footer class="post-footer">
      
        <div class="post-tags">
          
            <a href="/tags/OSI/" rel="tag">#OSI</a>
          
            <a href="/tags/TCP-IP/" rel="tag">#TCP/IP</a>
          
            <a href="/tags/Socket/" rel="tag">#Socket</a>
          
        </div>
      

      
        <div class="post-nav">
          <div class="post-nav-next post-nav-item">
            
              <a href="/2017/09/01/Language/Java-basic/Java 变量类型/" rel="next" title="Java 变量类型">
                <i class="fa fa-chevron-left"></i> Java 变量类型
              </a>
            
          </div>

          <div class="post-nav-prev post-nav-item">
            
          </div>
        </div>
      

      
      
    </footer>
  </article>



    <div class="post-spread">
      
    </div>
  </div>


          </div>
          


          
  <div class="comments" id="comments">
    


  </div>


        </div>
        
          
  
  <div class="sidebar-toggle">
    <div class="sidebar-toggle-line-wrap">
      <span class="sidebar-toggle-line sidebar-toggle-line-first"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-middle"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-last"></span>
    </div>
  </div>

  <aside id="sidebar" class="sidebar">
    <div class="sidebar-inner">

      

      
        <ul class="sidebar-nav motion-element">
          <li class="sidebar-nav-toc sidebar-nav-active" data-target="post-toc-wrap" >
            文章目录
          </li>
          <li class="sidebar-nav-overview" data-target="site-overview">
            站点概览
          </li>
        </ul>
      

      <section class="site-overview sidebar-panel ">
        <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
          <img class="site-author-image" itemprop="image"
               src="/statics/images/avatar.png"
               alt="gatewayzy" />
          <p class="site-author-name" itemprop="name">gatewayzy</p>
          <p class="site-description motion-element" itemprop="description">blog website with hexo and github pages</p>
        </div>
        <nav class="site-state motion-element">
          <div class="site-state-item site-state-posts">
            <a href="/archives">
              <span class="site-state-item-count">70</span>
              <span class="site-state-item-name">日志</span>
            </a>
          </div>

          
            <div class="site-state-item site-state-categories">
              <a href="/categories">
                <span class="site-state-item-count">10</span>
                <span class="site-state-item-name">分类</span>
              </a>
            </div>
          

          
            <div class="site-state-item site-state-tags">
              <a href="/tags">
                <span class="site-state-item-count">38</span>
                <span class="site-state-item-name">标签</span>
              </a>
            </div>
          

        </nav>

        

        <div class="links-of-author motion-element">
          
        </div>

        
        

        
        
          <div class="links-of-blogroll motion-element links-of-blogroll-inline">
            <div class="links-of-blogroll-title">
              <i class="fa  fa-fw fa-globe"></i>
              友情链接
            </div>
            <ul class="links-of-blogroll-list">
              
                <li class="links-of-blogroll-item">
                  <a href="https://github.com/gatewayzy" title="Github-gatewayzy" target="_blank">Github-gatewayzy</a>
                </li>
              
                <li class="links-of-blogroll-item">
                  <a href="http://google.com/" title="Goolge" target="_blank">Goolge</a>
                </li>
              
                <li class="links-of-blogroll-item">
                  <a href="http://wiki.jikexueyuan.com/" title="Wiki-jike" target="_blank">Wiki-jike</a>
                </li>
              
            </ul>
          </div>
        

      </section>

      
        <section class="post-toc-wrap motion-element sidebar-panel sidebar-panel-active">
          <div class="post-toc">
            
              
            
            
              <div class="post-toc-content"><ol class="nav"><li class="nav-item nav-level-2"><a class="nav-link" href="#OSI七层模型"><span class="nav-number">1.</span> <span class="nav-text">OSI七层模型</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#TCP-IP-模型"><span class="nav-number">2.</span> <span class="nav-text">TCP/IP 模型</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#Http和Socket连接区别"><span class="nav-number">3.</span> <span class="nav-text">Http和Socket连接区别</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#HTTP连接"><span class="nav-number">3.1.</span> <span class="nav-text">HTTP连接</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#Socket"><span class="nav-number">3.2.</span> <span class="nav-text">Socket</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#套接字（Socket）概念"><span class="nav-number">3.2.1.</span> <span class="nav-text">套接字（Socket）概念</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#建立Socket连接"><span class="nav-number">3.2.2.</span> <span class="nav-text">建立Socket连接</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#Socket连接与TCP、UDP连接"><span class="nav-number">3.2.3.</span> <span class="nav-text">Socket连接与TCP、UDP连接</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#Socket连接与HTTP连接"><span class="nav-number">3.2.4.</span> <span class="nav-text">Socket连接与HTTP连接</span></a></li></ol></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#基于Socket实现TCP架构"><span class="nav-number">4.</span> <span class="nav-text">基于Socket实现TCP架构</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#socket状态说明"><span class="nav-number">4.1.</span> <span class="nav-text">socket状态说明</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#TCP三次握手"><span class="nav-number">4.2.</span> <span class="nav-text">TCP三次握手</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#TCP四次挥手"><span class="nav-number">5.</span> <span class="nav-text">TCP四次挥手</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#基于Socket实现UDP架构"><span class="nav-number">6.</span> <span class="nav-text">基于Socket实现UDP架构</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#协议的区别"><span class="nav-number">7.</span> <span class="nav-text">协议的区别</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#TCP、UDP、HTTP、SOCKET之间的区别"><span class="nav-number">7.1.</span> <span class="nav-text">TCP、UDP、HTTP、SOCKET之间的区别</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#tcp和udp的区别"><span class="nav-number">7.2.</span> <span class="nav-text">tcp和udp的区别</span></a></li></ol></li></ol></div>
            
          </div>
        </section>
      

    </div>
  </aside>


        
      </div>
    </main>

    <footer id="footer" class="footer">
      <div class="footer-inner">
        <div class="copyright" >
  
  &copy; 
  <span itemprop="copyrightYear">2018</span>
  <span class="with-love">
    <i class="fa fa-heart"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">gatewayzy</span>
</div>

<div class="powered-by">
  由 <a class="theme-link" href="https://hexo.io">Hexo</a> 强力驱动
</div>

<div class="theme-info">
  主题 -
  <a class="theme-link" href="https://github.com/iissnan/hexo-theme-next">
    NexT.Mist
  </a>
</div>

        

        
      </div>
    </footer>

    <div class="back-to-top">
      <i class="fa fa-arrow-up"></i>
    </div>
  </div>

  

<script type="text/javascript">
  if (Object.prototype.toString.call(window.Promise) !== '[object Function]') {
    window.Promise = null;
  }
</script>









  



  
  <script type="text/javascript" src="/vendors/jquery/index.js?v=2.1.3"></script>

  
  <script type="text/javascript" src="/vendors/fastclick/lib/fastclick.min.js?v=1.0.6"></script>

  
  <script type="text/javascript" src="/vendors/jquery_lazyload/jquery.lazyload.js?v=1.9.7"></script>

  
  <script type="text/javascript" src="/vendors/velocity/velocity.min.js?v=1.2.1"></script>

  
  <script type="text/javascript" src="/vendors/velocity/velocity.ui.min.js?v=1.2.1"></script>

  
  <script type="text/javascript" src="/vendors/fancybox/source/jquery.fancybox.pack.js?v=2.1.5"></script>


  


  <script type="text/javascript" src="/js/src/utils.js?v=5.0.1"></script>

  <script type="text/javascript" src="/js/src/motion.js?v=5.0.1"></script>



  
  

  
  <script type="text/javascript" src="/js/src/scrollspy.js?v=5.0.1"></script>
<script type="text/javascript" src="/js/src/post-details.js?v=5.0.1"></script>



  


  <script type="text/javascript" src="/js/src/bootstrap.js?v=5.0.1"></script>



  



  




  
  

  
  <script type="text/x-mathjax-config">
    MathJax.Hub.Config({
      tex2jax: {
        inlineMath: [ ['$','$'], ["\\(","\\)"]  ],
        processEscapes: true,
        skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code']
      }
    });
  </script>

  <script type="text/x-mathjax-config">
    MathJax.Hub.Queue(function() {
      var all = MathJax.Hub.getAllJax(), i;
      for (i=0; i < all.length; i += 1) {
        all[i].SourceElement().parentNode.className += ' has-jax';
      }
    });
  </script>
  <script type="text/javascript" src="//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>



  

  
<script type="text/javascript" async src="//push.zhanzhang.baidu.com/push.js">
</script>


</body>
</html>
